package ranveterinaria.dao;

import ranveterinaria.excepcion.DAOExcepcion;
import ranveterinaria.modelo.ProductoModelo;
import ranveterinaria.modelo.PromocionModelo;
import ranveterinaria.util.ConexionBD;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;

public class PromocionDAO extends BaseDAO{
		
	public void insertar(PromocionModelo vo) throws DAOExcepcion {
		
		String query = "insert into promocion(NOMBRE_PROMOCION,DESCUENTO_PROMOCION,FECHA_INICIO,FECHA_EXPIRACION,CODIGO_PRODUCTO) values (?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			
			
			stmt.setString(1, vo.getNombrePromocion());
			stmt.setDouble(2, vo.getDescuentoPromocion());
			stmt.setString(3, new SimpleDateFormat("yyyy/MM/dd").format(vo.getFechaInicio()));
			stmt.setString(4, new SimpleDateFormat("yyyy/MM/dd").format(vo.getFechaExpiracion()));
			stmt.setInt(5, vo.getProducto().getIdProducto());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Collection<PromocionModelo> listar() throws DAOExcepcion {
        Collection<PromocionModelo> c = new ArrayList<PromocionModelo>();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
                con = ConexionBD.obtenerConexion();
                String query = "SELECT CODIGO_PROMOCION,NOMBRE_PROMOCION,DESCUENTO_PROMOCION,FECHA_INICIO,FECHA_EXPIRACION,CODIGO_PRODUCTO FROM PROMOCION ORDER BY CODIGO_PROMOCION DESC";
                stmt = con.prepareStatement(query);
                rs = stmt.executeQuery();
                while (rs.next()) {
                	PromocionModelo vo = new PromocionModelo();
                	
					vo.setCodigoPromocion(rs.getInt(1));
					vo.setNombrePromocion(rs.getString(2));
					vo.setDescuentoPromocion(rs.getDouble(3));
					vo.setFechaInicio(rs.getDate(4));
					vo.setFechaExpiracion(rs.getDate(5));
					ProductoDAO p = new ProductoDAO();					
					vo.setProducto(p.obtener(rs.getInt(6)));
					c.add(vo);
                }

        } catch (SQLException e) {
                System.err.println(e.getMessage());
                throw new DAOExcepcion(e.getMessage());
        } finally {
                this.cerrarResultSet(rs);
                this.cerrarStatement(stmt);
                this.cerrarConexion(con);
        }
        return c;
	}

	public void eliminar(int idPromocion) throws DAOExcepcion {
		
		String query = "DELETE FROM PROMOCION WHERE CODIGO_PROMOCION = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);

			stmt.setInt(1, idPromocion);
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Collection<PromocionModelo> listarPorProducto(int idProducto) throws DAOExcepcion {
        Collection<PromocionModelo> c = new ArrayList<PromocionModelo>();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
                con = ConexionBD.obtenerConexion();
                String query = "SELECT CODIGO_PROMOCION,NOMBRE_PROMOCION,DESCUENTO_PROMOCION,FECHA_INICIO,FECHA_EXPIRACION,CODIGO_PRODUCTO FROM PROMOCION WHERE CODIGO_PRODUCTO = ? ORDER BY CODIGO_PROMOCION DESC";
                stmt = con.prepareStatement(query);
                stmt.setInt(1, idProducto);
                rs = stmt.executeQuery();
                while (rs.next()) {
                	PromocionModelo vo = new PromocionModelo();
                	
					vo.setCodigoPromocion(rs.getInt(1));
					vo.setNombrePromocion(rs.getString(2));
					vo.setDescuentoPromocion(rs.getDouble(3));
					vo.setFechaInicio(rs.getDate(4));
					vo.setFechaExpiracion(rs.getDate(5));
					
					ProductoModelo p = new ProductoModelo();
					p.setIdProducto(rs.getInt(6));
					
					vo.setProducto(p);
					c.add(vo);
                }

        } catch (SQLException e) {
                System.err.println(e.getMessage());
                throw new DAOExcepcion(e.getMessage());
        } finally {
                this.cerrarResultSet(rs);
                this.cerrarStatement(stmt);
                this.cerrarConexion(con);
        }
        return c;
	}
	
	public PromocionModelo obtener(String id) throws DAOExcepcion {
        PromocionModelo c = new PromocionModelo();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        
        try {
                con = ConexionBD.obtenerConexion();
                String query = "SELECT CODIGO_PROMOCION,NOMBRE_PROMOCION,DESCUENTO_PROMOCION,FECHA_INICIO,FECHA_EXPIRACION,CODIGO_PRODUCTO FROM PROMOCION WHERE CODIGO_PROMOCION = ?";
                stmt = con.prepareStatement(query);
                stmt.setInt(1, Integer.parseInt(id));
                rs = stmt.executeQuery();
                while (rs.next()) {
                	PromocionModelo vo = new PromocionModelo();
                	
					vo.setCodigoPromocion(rs.getInt(1));
					vo.setNombrePromocion(rs.getString(2));
					vo.setDescuentoPromocion(rs.getDouble(3));
					vo.setFechaInicio(rs.getDate(4));
					vo.setFechaExpiracion(rs.getDate(5));
					ProductoDAO p = new ProductoDAO();					
					vo.setProducto(p.obtener(rs.getInt(6)));
					
					return vo;
                }

        } catch (SQLException e) {
                System.err.println(e.getMessage());
                throw new DAOExcepcion(e.getMessage());
        } finally {
                this.cerrarResultSet(rs);
                this.cerrarStatement(stmt);
                this.cerrarConexion(con);
        }
        return c;
	}
	
public void actualizar(PromocionModelo vo) throws DAOExcepcion {
		
		String query = "update promocion set NOMBRE_PROMOCION = ?,DESCUENTO_PROMOCION = ?,FECHA_INICIO=?,FECHA_EXPIRACION=?,CODIGO_PRODUCTO=? where codigo_promocion = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			
			
			stmt.setString(1, vo.getNombrePromocion());
			stmt.setDouble(2, vo.getDescuentoPromocion());
			stmt.setString(3, new SimpleDateFormat("yyyy/MM/dd").format(vo.getFechaInicio()));
			stmt.setString(4, new SimpleDateFormat("yyyy/MM/dd").format(vo.getFechaExpiracion()));
			stmt.setInt(5, vo.getProducto().getIdProducto());
			stmt.setInt(6, vo.getCodigoPromocion());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
}





